package com.atguigu.controller;

import com.atguigu.utils.UUIDUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 客户端浏览器的文件上传
 */
@Controller
@RequestMapping("file")
public class FileController {
    @Autowired
    private ServletContext context;

    /**
     * SpringMVC框架，封装了一个接口 MultipartFile
     * 接口就可以解析浏览器上传的文件
     * 接口方法：
     *   String getOriginalFilename() 获取上传的文件的名字
     *   byte[] getBytes() 上传的文件转成字节数组
     *   void transferTo(File file)转换方法，将上传文件转换到File对象
     *
     * MultipartFile接口的实现类，SpringMVC定义，被当做处理器方法的参数传递
     *
     * 注意：处理器的方法参数，参数的名字，必须和页面中 表单的name属性值要对应
     *
     * 细节：处理多个文件的同时上传，利用数组
     * 处理的方法，不再是单一的MultipartFile类型，而是数组
     */
    @RequestMapping("fileUpload")
    public String fileUpload(MultipartFile[] multipartFile) throws IOException {
        for(MultipartFile mul:multipartFile) {
            //multipartFile方法，获取上传的文件名
            String filename = mul.getOriginalFilename();
            //filename = Jellyfish.jpg
            //获取文件的后缀名,Apache的IO工具类，Commons已经完成
            String suffix = "." + FilenameUtils.getExtension(filename);
            //重新定义上传的文件名
            String uploadFileName = "atguigu" + System.currentTimeMillis() + UUIDUtils.getUUID() + suffix;
            //获取文件上传后，要存储的文件夹的绝对路径
            String uploadDir = context.getRealPath("uploadDir");
            //System.out.println("uploadDir = " + uploadDir);
            //在当前的上传路径下面，创建日期命名的文件夹
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String formatDate = sdf.format(new Date());
            //上传的路径和日期路径，组成File对象
            File uploadDirDate = new File(uploadDir, formatDate);
            if (!uploadDirDate.exists())
                uploadDirDate.mkdirs();

            //multipartFile接口的方法transferTo实现上传，传递File对象
            //完整的上传路径，上的目录+文件名
            mul.transferTo(new File(uploadDirDate, uploadFileName));
        }
        return "forward:/success.jsp";
    }
}
